package controllers

import (
	"encoding/json"
	"strconv"

	"github.com/beego/beego/v2/core/logs"
	"github.com/beego/beego/v2/server/web"

	"supershare/backend/middleware"
	"supershare/backend/models"
)

// MiniprogramContentController 小程序内容控制器
type MiniprogramContentController struct {
	web.Controller
}

// Get 获取内容列表
// @Title Get
// @Description 获取内容列表
// @Param page query int false "页码"
// @Param pageSize query int false "每页数量"
// @Param title query string false "标题"
// @Param type query string false "类型"
// @Param status query int false "状态"
// @Success 200 {object} models.Response
// @Failure 500 服务器错误
// @router / [get]
func (c *MiniprogramContentController) Get() {
	// 获取分页参数
	page, _ := c.GetInt("page", 1)
	pageSize, _ := c.GetInt("pageSize", 10)

	// 获取过滤条件
	filters := make(map[string]interface{})
	if title := c.GetString("title"); title != "" {
		filters["title"] = title
	}
	if contentType := c.GetString("type"); contentType != "" {
		filters["type"] = contentType
	}
	if status, err := c.GetInt8("status"); err == nil {
		filters["status"] = status
	}
	admin, _ := middleware.GetCurrentAdmin(c.Ctx)
	if admin == nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "参数错误",
			"error":   "没有权限",
		}
		c.ServeJSON()
		return
	}
	if admin.FranchiseId > 0 {
		filters["franchise_id"] = admin.FranchiseId
	}
	// 获取内容列表
	contents, total, err := models.GetContentList(page, pageSize, filters)
	if err != nil {
		logs.Error("获取内容列表失败: %v", err)
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "获取内容列表失败",
			"error":   err.Error(),
		}
		c.ServeJSON()
		return
	}

	// 返回结果
	c.Data["json"] = map[string]interface{}{
		"success": true,
		"message": "获取内容列表成功",
		"data": map[string]interface{}{
			"list":  contents,
			"total": total,    // 总数
			"page":  page,     // 当前页码
			"size":  pageSize, // 每页数量
		},
	}
	c.ServeJSON()
}

// GetOne 获取单个内容
// @Title GetOne
// @Description 获取单个内容
// @Param id path int true "内容ID"
// @Success 200 {object} models.Response
// @Failure 500 服务器错误
// @router /:id [get]
func (c *MiniprogramContentController) GetOne() {
	// 获取内容ID
	idStr := c.Ctx.Input.Param(":id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "参数错误",
			"error":   "ID必须是数字",
		}
		c.ServeJSON()
		return
	}

	// 获取内容
	content, err := models.GetContentById(id)
	if err != nil {
		logs.Error("获取内容失败: %v", err)
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "获取内容失败",
			"error":   err.Error(),
		}
		c.ServeJSON()
		return
	}

	// 返回结果
	c.Data["json"] = map[string]interface{}{
		"success": true,
		"message": "获取内容成功",
		"data":    content,
	}
	c.ServeJSON()
}

// Post 创建内容
// @Title Post
// @Description 创建内容
// @Param body body models.MiniprogramContent true "内容信息"
// @Success 200 {object} models.Response
// @Failure 500 服务器错误
// @router / [post]
func (c *MiniprogramContentController) Post() {
	// 解析请求参数
	var content models.MiniprogramContent
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &content)
	if err != nil {
		logs.Error("解析请求参数失败: %v", err)
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "参数错误",
			"error":   err.Error(),
		}
		c.ServeJSON()
		return
	}

	admin, _ := middleware.GetCurrentAdmin(c.Ctx)
	if admin == nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "参数错误",
			"error":   "没有权限",
		}
		c.ServeJSON()
		return
	}

	content.FranchiseId = admin.FranchiseId
	content.CreatedBy = admin.Username
	content.UpdatedBy = admin.Username
	content.BeforeInsert()
	// 创建内容
	_, err = models.CreateContent(&content)
	if err != nil {
		logs.Error("创建内容失败: %v", err)
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "创建内容失败",
			"error":   err.Error(),
		}
		c.ServeJSON()
		return
	}

	// 返回结果
	c.Data["json"] = map[string]interface{}{
		"success": true,
		"message": "创建内容成功",
	}
	c.ServeJSON()
}

// Put 更新内容
// @Title Put
// @Description 更新内容
// @Param body body models.MiniprogramContent true "内容信息"
// @Success 200 {object} models.Response
// @Failure 500 服务器错误
// @router / [put]
func (c *MiniprogramContentController) Put() {
	// 解析请求参数
	var content models.MiniprogramContent
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &content)
	if err != nil {
		logs.Error("解析请求参数失败: %v", err)
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "参数错误",
			"error":   err.Error(),
		}
		c.ServeJSON()
		return
	}
	admin, _ := middleware.GetCurrentAdmin(c.Ctx)
	if admin == nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "参数错误",
			"error":   "没有权限",
		}
		c.ServeJSON()
		return
	}
	content.FranchiseId = admin.FranchiseId
	content.UpdatedBy = admin.Username
	content.BeforeUpdate()
	// 更新内容
	err = models.UpdateContent(&content)
	if err != nil {
		logs.Error("更新内容失败: %v", err)
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "更新内容失败",
			"error":   err.Error(),
		}
		c.ServeJSON()
		return
	}

	// 返回结果
	c.Data["json"] = map[string]interface{}{
		"success": true,
		"message": "更新内容成功",
	}
	c.ServeJSON()
}

// Delete 删除内容
// @Title Delete
// @Description 删除内容
// @Param id path int true "内容ID"
// @Success 200 {object} models.Response
// @Failure 500 服务器错误
// @router /:id [delete]
func (c *MiniprogramContentController) Delete() {
	// 获取内容ID
	idStr := c.Ctx.Input.Param(":id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "参数错误",
			"error":   "ID必须是数字",
		}
		c.ServeJSON()
		return
	}

	// 删除内容
	err = models.DeleteContent(id)
	if err != nil {
		logs.Error("删除内容失败: %v", err)
		c.Data["json"] = map[string]interface{}{
			"success": false,
			"message": "删除内容失败",
			"error":   err.Error(),
		}
		c.ServeJSON()
		return
	}

	// 返回结果
	c.Data["json"] = map[string]interface{}{
		"success": true,
		"message": "删除内容成功",
	}
	c.ServeJSON()
}
